// 1.自定义自动化柯里化函数
function yzCurrying(fn) {
  function curried(...args) {
    // fn.length 指的是函数的参数
    if(args.length >= fn.length) {
      return fn.apply(this, args)
    } else {
      function curried2(...args2) {
        var result = curried.apply(this, [...args, ...args2])
        return result
      }

      return curried2
    }
  }
  return curried
}

// 使用
function sum(num1, num2, num3, num4) {
  console.log(num1 + num2 + num3 + num4);
}
var curriedSum = yzCurrying(sum);
curriedSum(10)(10)(10)(10);
curriedSum(10, 20)(30, 40);
// function log(date, type, message) {
//   console.log(`[${date.getHours()}:${date.getMinutes()}][${type}]:[${message}]`);
// }
// var curriedLog = yzCurrying(log)
// var nowAndDebugLog = curriedLog(new Date(), "DEBUG")
// nowAndDebugLog("显示错误")
// // nowAndDebugLog("菜单错误")
// // var a = new Date()
// // a.getHours()
// // 2.自定义组合函数  多个
// function yzCompose(...fns) {
//   var length = fns.length
//   for(var i = 0; i < length; i++) {
//     if(typeof(fns[i]) !== 'function') {
//       throw new TypeError("Expected argument are functions")
//     }
//   }
  
//   function compose(...args) {
//     var index = 0
//     var result = fns[index] ? fns[index].apply(this, args) : 0
//     while(++index < length) {
//       result = fns[index].call(this, result)
//     }
//     return result
//   }


//   return compose
// }


// // // 组合函数
// function double(num) {
//   return num * 2
// }

// function square(num) {
//   return num ** 2
// }
// var composeFn = yzCompose(double, square)
// console.log(composeFn(10));



